1. MPC response overview
As of March 20 2023, a total of 308,467 persons or 64,846 families
have been reached by MPC interventions.
A total of USD 9,391,450 has been disbursed by 14 implementing
agencies across 22 sub-districts.
Only beneficiaries who have received at least USD 100/family/month
have been included. Additionally, current achievement reporting has yet
to include the collective sites, only information on communities, so it
is not clear to what extent needs have been met in these centres. This
will be corrected in revised 4W template.
308,467 people reached, USD 9.4 million disbursed, 20230317
governorate | district | partners | communities | households | beneficiaries | total_usd | %_beneficiaries |
Aleppo | A'zaz | 3 | 3 | 895 | 4,475 | 134,250 | 1.45 |
Aleppo | Afrin | 6 | 50 | 15,993 | 79,850 | 2,398,950 | 25.89 |
Aleppo | Al Bab | 2 | 3 | 400 | 1,677 | 60,000 | 0.54 |
Aleppo | Jarablus | 3 | 1 | 400 | 2,005 | 60,000 | 0.65 |
Aleppo | Jebel Saman | 5 | 8 | 3,276 | 16,840 | 480,150 | 5.46 |
Idleb | Harim | 12 | 31 | 37,345 | 170,164 | 5,326,750 | 55.16 |
Idleb | Idleb | 6 | 7 | 4,973 | 25,392 | 726,480 | 8.23 |
Idleb | Jisr-Ash-Shugur | 4 | 8 | 1,564 | 8,064 | 204,870 | 2.61 |
Total | - | - | - | 64,846 | 308,467 | 9,391,450 | 100.00 |
2. Map of MPC beneficiaries and collective/reception centres
Data on cash response extracted from FSL
earthquake tracker on March 17 2023. Data on collective centres
extracted from March 15 2023.
Locations of beneficiaries have been estimated – the FSL dataset does
not call for the input of geocoordinates. Instead, the blue circles are
situated at the centroids for communities/villages, as recorded in the
OCHA geodamins reference dataset.
This means that we do not have an accurate record of which centres
have received which activities. This underscores the importance of
including of codifying and including each of the temporary sites so that
we may track the progress of the response and identify any gaps in
coverage that arise. Temporary sites have been included in the revised
4Ws.
3. Geographic breakdown of beneficiaries
Coverage is highest in Afrin and Harim districts – substantially
so.

The current distribution of beneficiaries, at least at district
level, is commonsensical. Harim and Afrin do have a much larger share of
the earthqauke impacts. Bear in mind that the figures below only pertain
to populations within the AOC of Northwest Syria and not all parts of
each district are included.
Casualties and damaged houses, absolute figures and per 100,000
persons
governorate | district | wounded_dead1 | wounded_dead_100k1 | damaged_houses1 | damaged_houses_100k1 |
Aleppo | A'zaz | 356 | 57.87 | 276 | 44.86 |
Aleppo | Afrin | 2,232 | 478.79 | 2,910 | 624.22 |
Aleppo | Al Bab | 206 | 70.04 | 832 | 282.89 |
Aleppo | Jarablus | 40 | 33.82 | 257 | 217.30 |
Aleppo | Jebel Saman | 616 | 236.80 | 176 | 67.66 |
Idleb | Harim | 8,449 | 507.65 | 3,230 | 194.07 |
Idleb | Idleb | 350 | 48.23 | 946 | 130.37 |
Idleb | Jisr-Ash-Shugur | 595 | 183.68 | 1,915 | 591.18 |
1Data from the Assistance Coordination Unit, Syria 20230307 |
When reviewing the district-level spread of casualties and totally-
and partially-damaged houses, Harim and Afrin do stand out in terms of
the magnitude of the damage, though it should be noted that the share of
damaged houses in Afrin is much higher than in Harim.
Following them, Jebel Saman and Jisr-ash-Shugur have the next most
severe damage, though, as can be seen from the table below, their
populations (within the area of control) are comparatively smaller.
Assessments are still ongoing and the CWG will update these tables
when new data becomes available.
Percentage of population reached by district
governorate | district | total_population1 | beneficiaries | %_reached | partners |
Aleppo | A'zaz | 615,194 | 4,475 | 0.73 | 3 |
Aleppo | Afrin | 466,179 | 79,850 | 17.13 | 6 |
Aleppo | Al Bab | 294,112 | 1,677 | 0.57 | 2 |
Aleppo | Jarablus | 118,271 | 2,005 | 1.70 | 3 |
Aleppo | Jebel Saman | 260,134 | 16,840 | 6.47 | 5 |
Idleb | Harim | 1,664,324 | 170,164 | 10.22 | 12 |
Idleb | Idleb | 725,644 | 25,392 | 3.50 | 6 |
Idleb | Jisr-Ash-Shugur | 323,929 | 8,064 | 2.49 | 4 |
1Only persons within the NW Area of Control |
Though the earthquake damage is not as severe in A’zaz, Al Bab,
Jarablus, Idleb and Jisr-ash-Shugur, a much higher proportion of needs
in these areas remain unmet, given the low percentages of persons
reached.
The establishment of subnational targets at the district and
sub-district level, will go some way towards clarifying how resources
should be allocated across the affected areas.
3.1 Breakdown by partner and district
Harim, by far and away has the highest concentration of partners
(12), double that of the next highest district (Afrin).
3.2 Scatterplot of sub-districts
The plot below shows the total population of each sub-district on the
x-axis (for the moment, all persons in these areas are assumed to be
affected and are included in the PIN) and the number of beneficiaries on
the y-axis.
The size of each point indicates the number of dead or wounded
persons there per 100,000.

Overall, we see fair alignment between the magnitude of the needs
(total population) and the number of beneficiaries – this is evidenced
by the blue line showing a positive relationship.
However, we do note several mismatches – Dana seems to have received
an outsized share of beneficiaries, especially when considering the
casualty rate. And Kafr Takharim seems to have been allocated relatively
fewer resources in comparison to the death toll there.
4. Cash response actors and cash disbursed
In the scatterplot below, each point is a single cash working group
partner. The x-axis indicates the number of beneficiaries reached per
agency and the y-axis indicates the number of communities (admin4)
reached.
USD 9,391,450 has been distributed across 111 communities and 22
sub-districts in NW Syria.
The table below summarises the information in the scatterplot above
in tabular form:
Reach and footprint of cash response actors
partner_code1 | beneficiaries | districts | communities |
CBR-004 | 60,655 | 3 | 36 |
CBR-006 | 39,000 | 3 | 17 |
CBR-044 | 36,145 | 4 | 10 |
CBR-013 | 27,045 | 7 | 39 |
CBR-032 | 15,900 | 1 | 3 |
CBR-035 | 15,642 | 4 | 12 |
CBR-038 | 12,000 | 1 | 1 |
CBR-031 | 9,111 | 7 | 21 |
CBR-008 | 7,199 | 2 | 5 |
CBR-042 | 7,008 | 1 | 4 |
CBR-005 | 5,615 | 4 | 11 |
CBR-040 | 5,000 | 1 | 1 |
CBR-041 | 3,277 | 2 | 2 |
CBR-037 | 2,500 | 1 | 1 |
1Only partners who provided more than USD 100/family/month |
4.1 USD disbursed by partner
There is very good compliance with CWG standards on the transfer
values of multipurpose cash interventions, as can be seen by the
usd_per_fam column in the table below.
USD disbursed and families reached by partner
partner_code | usd_total | families | usd_per_fam | %_usd_total |
CBR-004 | 2,451,750 | 16,345 | 150.00 | 26.11 |
CBR-006 | 1,365,000 | 9,100 | 150.00 | 14.53 |
CBR-044 | 1,178,200 | 8,980 | 131.20 | 12.55 |
CBR-032 | 1,116,450 | 7,443 | 150.00 | 11.89 |
CBR-013 | 994,800 | 6,702 | 148.43 | 10.59 |
CBR-031 | 435,000 | 2,900 | 150.00 | 4.63 |
CBR-038 | 360,000 | 2,400 | 150.00 | 3.83 |
CBR-035 | 312,300 | 3,123 | 100.00 | 3.33 |
CBR-042 | 301,200 | 2,008 | 150.00 | 3.21 |
CBR-005 | 271,800 | 1,812 | 150.00 | 2.89 |
CBR-008 | 218,400 | 1,456 | 150.00 | 2.33 |
CBR-040 | 150,000 | 1,000 | 150.00 | 1.60 |
CBR-037 | 139,050 | 927 | 150.00 | 1.48 |
CBR-041 | 97,500 | 650 | 150.00 | 1.04 |
Broadening the scope to look at all cash-based activities, not just
MPC, it is still observed that more that 3/4 of all beneficiary
households have received a USD 150 payment, with about 10% receiving USD
50.
This may necessitate splitting the Cash Response
activity into a full-ration and half/quarter ration activities.
USD transfer values for all cash-based activities, not just MPC
usd_transfer_value | families | beneficiaries1 | %_beneficiaries |
$25 | 180 | 850 | 0.25 |
$45 | 24 | 120 | 0.03 |
$50 | 7,062 | 35,310 | 10.23 |
$60 | 60 | 420 | 0.12 |
$100 | 5,699 | 31,618 | 9.16 |
$120 | 350 | 1,750 | 0.51 |
$130 | 2,000 | 10,000 | 2.90 |
$150 | 56,797 | 265,099 | 76.80 |
1Data from the FSL tracker, all cash and FSL actvities included |
5. UNHCR site tracker – searchable table
Data from UNHCR
site tracker. Extracted 20230315.
LS0tDQp0aXRsZTogIk5vcnRod2VzdCBTeXJpYSBDYXNoIFdvcmtpbmcgR3JvdXAgRWFydGhxdWFrZSBSZXNwb25zZSBCdWxsZXRpbiINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk5XUy1DV0cgbG9nby5QTkciKTsNCiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOw0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7DQogICAgICAgIG1heC13aWR0aDogMTI4MHB4Ow0KICAgIH0NCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbGlicmFyeShnZ3Jhc3RyKQ0KbGlicmFyeShodG1sd2lkZ2V0cykNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgZGlzYWJsaW5nIHNjaWVudGlmaWMgbm90YXRpb24NCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQojIHBhbmRlciB0YWJsZXMgYWxsIGluIG9uZSByb3cNCnBhbmRlck9wdGlvbnMoJ3RhYmxlLnNwbGl0LnRhYmxlJywgSW5mKQ0KDQojIHBhbmRlciB0aG91c2FuZHMgc2VwYXJhdG9yDQpwYW5kZXJPcHRpb25zKCJiaWcubWFyayIsICIsIikNCg0KIyByZXBsYWNlIA0Kb3B0cyA8LSBvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gIiIpDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMNCnN1bV9iZW4gPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIpew0KICANCiAgY29sdW1uX3ZhciA8LSBlbnF1byhjb2x1bW5fdmFyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkNCiAgICANCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMsIDIgZ3JvdXBlZCB2YXJpYWJsZXMNCnN1bV9iZW4yIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyMSwgY29sdW1uX3ZhcjIpew0KICANCiAgY29sdW1uX3ZhcjEgPC0gZW5xdW8oY29sdW1uX3ZhcjEpDQogIGNvbHVtbl92YXIyIDwtIGVucXVvKGNvbHVtbl92YXIyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyMSwgISFjb2x1bW5fdmFyMikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpDQogICAgDQp9DQoNCiMgc2NhbGluZyBmdW5jdGlvbnMgDQpyYW5nZTAxIDwtIGZ1bmN0aW9uKHgpeyh4LW1pbih4KSkvKG1heCh4KS1taW4oeCkpfQ0KcmFuZ2Vfd25hIDwtIGZ1bmN0aW9uKHgpeyh4LW1pbih4LCBuYS5ybSA9IFRSVUUpKS8obWF4KHgsIG5hLnJtID0gVFJVRSktbWluKHgsIG5hLnJtID0gVFJVRSkpfQ0KDQojbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQpgYGANCg0KYGBge3IgZGF0YX0NCnBjb2RlM19zaGFwZSA8LSANCiAgc3RfcmVhZCgiLi9kYXRhL3N5cl9hZG1ibmRhX3VuY3NfdW5vY2hhXzIwMjAxMjE3L3N5cl9hZG1ibmRhX2FkbTNfdW5jc191bm9jaGFfMjAyMDEyMTcuc2hwIiwgDQogICAgICAgICAgcXVpZXQgPSBUUlVFKQ0KDQpsb2NhdGlvbnMgPC0gcmVhZF9leGNlbCgiLi9kYXRhL0xvY2F0aW9ucy54bHN4IikgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCmZzbCA8LSByZWFkX2NzdigiLi9kYXRhL2Zvcl9yZXBvcnQvZnNsLmNzdiIpICU+JSANCiAgbXV0YXRlKHBhcnRuZXJfY29kZSA9IGlmZWxzZShpcy5uYShwYXJ0bmVyX2NvZGUpLCAidGVtcF8xIiwgcGFydG5lcl9jb2RlKSkNCg0Kc2l0ZXMgPC0gcmVhZF9jc3YoIi4vZGF0YS9mb3JfcmVwb3J0L3NpdGVzLmNzdiIpDQoNCnJlbW92ZV9zaXRlcyA8LSByZWFkX2NzdigiLi9kYXRhL2Zvcl9yZXBvcnQvc2l0ZXNfbG9jYXRpb25zX2ZzbC5jc3YiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShsb25naXR1ZGVfeCkgJiAhaXMubmEobGF0aXR1ZGVfeSkpICU+JSANCiAgc3RfYXNfc2YoY29vcmRzID0gYygibG9uZ2l0dWRlX3giLCAibGF0aXR1ZGVfeSIpLCBjcnMgPSA0MzI2KSAlPiUNCiAgc3RfdHJhbnNmb3JtKHN0X2NycyhwY29kZTNfc2hhcGUpKSAlPiUgDQogIG11dGF0ZShpbnRlcnNlY3Rpb24gPSBhcy5pbnRlZ2VyKHN0X2ludGVyc2VjdHMoZ2VvbWV0cnksIHBjb2RlM19zaGFwZSkpLCANCiAgICAgICAgIGFyZWEgPSBpZmVsc2UoaXMubmEoaW50ZXJzZWN0aW9uKSwgIiIsIHBjb2RlM19zaGFwZSRBRE0zX1BDT0RFW2ludGVyc2VjdGlvbl0pKSAlPiUNCiAgZmlsdGVyKGlzLm5hKGludGVyc2VjdGlvbikpIA0KDQpzaXRlc19sb2NhdGlvbnNfZnNsIDwtIHJlYWRfY3N2KCIuL2RhdGEvZm9yX3JlcG9ydC9zaXRlc19sb2NhdGlvbnNfZnNsLmNzdiIpICU+JSANCiAgYW50aV9qb2luKHJlbW92ZV9zaXRlcywgYnkgPSBjKCJzaXRlX25hbWUiKSkNCg0KbmFtZXNfZXEgPC0gYygNCiAgImRhdGUiLA0KICAiZ292ZXJub3JhdGUiLA0KICAiZGlzdHJpY3QiLA0KICAic3ViX2Rpc3RyaWN0IiwNCiAgImNvbW11bml0eSIsDQogICJhZG1pbjQiLA0KICAiY2FzdWFsdGllcyIsDQogICJpbmp1cmllcyIsDQogICJjb21wbGV0ZWx5X2Rlc3Ryb3llZF9ob3VzZXMiLA0KICAiZGFtYWdlZF91bmloYWJpdGFibGVfaG91c2VzIiwNCiAgInRlbXBvcmFyeV9hY2NvbW1vZGF0aW9uX2NlbnRyZXMiLA0KICAiaWRwc19pbl9hbGxfY2VudHJlcyIsDQogICJzY2hvb2xzX2FzX2FjY29tb2RhdGlvbl9jZW50cmVzIiwNCiAgImlkcHNfaW5fc2Nob29scyIsDQogICJ0ZW50c19uZWVkZWQiLA0KICAiYmxhbmtldHNfbWF0dHJlc3Nlc19uZWVkZWQiLA0KICAidGVtcG9yYXJ5X2FjY29tbW9kYXRpb25fY2VudHJlc19hdmFpbGFibGUiLCANCiAgImFjY2Vzc2libGVfY2l2aWxfZGVmZW5zZSIsDQogICJsYXRyaW5lc19hdmFpbGFibGUiLA0KICAibWVhbHNfbmVlZGVkX3Blcl9kYXkiLA0KICAibmVlZF9ibG9vZF9kb25hdGlvbnMiLA0KICAiaGVhbHRoX3NlcnZpY2VzX2F2YWlsYWJsZSIsDQogICJuZWNlc3NhcnlfbWVkaWNhbF9lcXVpcG1lbnQiLA0KICAicnViYmxlX3ZvbHVudGVlcnMiLA0KICAidGVsZWNvbXNfYXZhaWxhYmxlIiwNCiAgImVsZWN0cmljaXR5X2F2YWlsYWJsZSIsIA0KICAiaGVhdGluZ19mdWVsX25lZWRlZCINCikNCg0KZXEgPC0gcmVhZF9leGNlbCgiLi9kYXRhL3N5cmlhLWVhcnRocXVha2UtaW1wYWN0LTA1LW1hcmNoLTIwMjMueGxzeCIsDQogICAgICAgICAgICAgICAgIHNoZWV0ID0gIkRBVEFTRVQiKSAlPiUgDQogIHNldE5hbWVzKG5hbWVzX2VxKSAlPiUgDQogIGxlZnRfam9pbihsb2NhdGlvbnMgJT4lIHNlbGVjdChhZG1pbjRwY29kZSwgYWRtaW4zcGNvZGUpLCANCiAgICAgICAgICAgIGJ5ID0gYygiYWRtaW40IiA9ICJhZG1pbjRwY29kZSIpKQ0KDQoNCmhubyA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvMjAyM0hOT19QaU5fU2V2ZXJpdHlfZGV0YWlsZWRBb0lfRk9SU0hBUkUgMTUwMzIwMjMueGxzeCIsIHNraXAgPSAxLCANCiAgICAgICAgICAgICAgICAgIHNoZWV0ID0gMSkgJT4lDQogIGNsZWFuX25hbWVzKCkNCg0KbndfcGNvZGUzIDwtIGhubyAlPiUgDQogIGZpbHRlcihhb19jID09ICJOVyIpICU+JSANCiAgcHVsbChhZG1pbjNwY29kZSkNCmBgYA0KDQoNCg0KPGJyPjxicj48YnI+DQoNCiMgMS4gTVBDIHJlc3BvbnNlIG92ZXJ2aWV3DQoNCkFzIG9mIGByIGZvcm1hdChTeXMudGltZSgpLCAiJUIgJWQgJVkiKWAsIGEgdG90YWwgb2YgYHIgZnNsICU+JSBmaWx0ZXIoYWN0aXZpdHkgPT0gIkNhc2ggUmVzcG9uc2UiICYgcGxhbm5lZF9pbXBsZW1lbnRlZCA9PSAiSW1wbGVtZW50ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyBvciBgciBmc2wgJT4lIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSB7c3VtKC4kZmFtaWxpZXMpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgZmFtaWxpZXMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgTVBDIGludGVydmVudGlvbnMuIA0KDQpBIHRvdGFsIG9mIFVTRCBgciBmc2wgJT4lIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSBtdXRhdGUodXNkX3RvdGFsID0gZmFtaWxpZXMgKiBxdWFudGl0eSkgJT4lICB7c3VtKC4kdXNkX3RvdGFsKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGhhcyBiZWVuIGRpc2J1cnNlZCBieSBgciBmc2wgJT4lIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSBzdW1tYXJpc2Uobl9kaXN0aW5jdChwYXJ0bmVyX2NvZGUpKSAlPiUgcHVsbCgpYCBpbXBsZW1lbnRpbmcgYWdlbmNpZXMgYWNyb3NzIGByIGZzbCAlPiUgZmlsdGVyKGFjdGl2aXR5ID09ICJDYXNoIFJlc3BvbnNlIiAmIHBsYW5uZWRfaW1wbGVtZW50ZWQgPT0gIkltcGxlbWVudGVkIikgJT4lIHN1bW1hcmlzZShuX2Rpc3RpbmN0KGFkbWluM3Bjb2RlKSkgJT4lIHB1bGwoKWAgc3ViLWRpc3RyaWN0cy4gDQoNCk9ubHkgYmVuZWZpY2lhcmllcyB3aG8gaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCBVU0QgMTAwL2ZhbWlseS9tb250aCBoYXZlIGJlZW4gaW5jbHVkZWQuIEFkZGl0aW9uYWxseSwgY3VycmVudCBhY2hpZXZlbWVudCByZXBvcnRpbmcgaGFzIHlldCB0byBpbmNsdWRlIHRoZSBjb2xsZWN0aXZlIHNpdGVzLCBvbmx5IGluZm9ybWF0aW9uIG9uIGNvbW11bml0aWVzLCBzbyBpdCBpcyBub3QgY2xlYXIgdG8gd2hhdCBleHRlbnQgbmVlZHMgaGF2ZSBiZWVuIG1ldCBpbiB0aGVzZSBjZW50cmVzLiBUaGlzIHdpbGwgYmUgY29ycmVjdGVkIGluIHJldmlzZWQgNFcgdGVtcGxhdGUuIA0KDQo8YnI+DQoNCmBgYHtyIHN1bW1hcnkgdGFibGV9DQpmc2wgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHkgPT0gIkNhc2ggUmVzcG9uc2UiICYgcGxhbm5lZF9pbXBsZW1lbnRlZCA9PSAiSW1wbGVtZW50ZWQiKSAlPiUNCiAgbXV0YXRlKHVzZF90b3RhbCA9IGZhbWlsaWVzICogcXVhbnRpdHkpICU+JSANCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUsIGRpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QocGFydG5lcl9jb2RlKSwgDQogICAgICAgICAgICBjb21tdW5pdGllcyA9IG5fZGlzdGluY3QoYWRtaW40cGNvZGUpLCANCiAgICAgICAgICAgIGhvdXNlaG9sZHMgPSBzdW0oZmFtaWxpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHRvdGFsX3VzZCA9IHN1bSh1c2RfdG90YWwsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gDQogICAgICAgICAgIHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JQ0KICBhZG9ybl90b3RhbHMoInJvdyIsLCwsIGhvdXNlaG9sZHMsIGJlbmVmaWNpYXJpZXMsIHRvdGFsX3VzZCwgYCVfYmVuZWZpY2lhcmllc2ApICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gaWZlbHNlKGAlX2JlbmVmaWNpYXJpZXNgID4gOTkuOTgsIDEwMCwgYCVfYmVuZWZpY2lhcmllc2ApKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIjMwOCw0NjcgcGVvcGxlIHJlYWNoZWQsIFVTRCA5LjQgbWlsbGlvbiBkaXNidXJzZWQsIDIwMjMwMzE3IikgJT4lIA0KICB0aGVtZV96ZWJyYSgpDQogIA0KICANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KDQojIDIuIE1hcCBvZiBNUEMgYmVuZWZpY2lhcmllcyBhbmQgY29sbGVjdGl2ZS9yZWNlcHRpb24gY2VudHJlcw0KDQoNCjxicj4NCg0KDQpgYGB7ciBwbG90bHktc2l0ZXN9DQoNCnNpdGVfbWFwIDwtIHNpdGVzX2xvY2F0aW9uc19mc2wgJT4lIA0KICBsZWZ0X2pvaW4obG9jYXRpb25zICU+JSBzZWxlY3QoYWRtaW4zcGNvZGUsIGFkbWluNHBjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjRwY29kZSIpICU+JQ0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjNwY29kZSIgPSAiQURNM19QQ09ERSIpKSAlPiUgDQogIGZpbHRlcihBRE0xX1BDT0RFICVpbiUgYygiU1kwMiIsICJTWTA3IikpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIG11dGF0ZSh0eXBlID0gZmN0X3JlbGV2ZWwodHlwZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiUkMvSURQIiwgIkJlbmVmaWNpYXJpZXMiKSkpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gMC4xLCBjb2xvdXIgPSAiZ3JleTcwIikgKw0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gcGVyc29ucywgDQogICAgICAgICAgICAgICAgICBjb2xvdXIgPSB0eXBlLA0KICAgICAgICAgICAgICAgICAgeCA9IGxvbmdpdHVkZV94LCB5ID0gbGF0aXR1ZGVfeSwNCiAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoInN1Yl9kaXN0cmljdDogIiwgc3ViX2Rpc3RyaWN0LCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l0ZTogIiwgc2l0ZV9uYW1lLCAiXG4iLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJzb25zOiAiLCBwZXJzb25zLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGU6ICIsIHR5cGUsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uX3g6ICIsIGxvbmdpdHVkZV94LCAiXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXRfeTogIiwgbGF0aXR1ZGVfeSkpLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCBzdHJva2UgPSAuNQ0KICAgICAgICAgICAgICMgQWRqdXN0aW5nIGFscGhhIHdvbid0IGFmZmVjdCBhIHBsb3RseQ0KICAgICAgICAgICAgICkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gTkEpLCANCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBsYWJzKHRpdGxlID0gIkNvbGxlY3RpdmUvcmVjZXB0aW9uIGNlbnRyZXMgYW5kIE1QQyBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgc3VidGl0bGUgPSAiSURQcyBpbiByZWQsIGJlbmVmaWNpYXJpZXMgaW4gYmx1ZSwgc2l6ZSBzaG93cyBudW1iZXIgb2YgcGVyc29ucyIpDQoNCmdncGxvdGx5KHNpdGVfbWFwLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUgDQogIHBsb3RseTo6c3R5bGUoaG92ZXJvbiA9ICJwb2ludCIpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJDb2xsZWN0aXZlIGNlbnRyZXMgYW5kIGNhc2ggcmVzcG9uc2UgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEUHMgaW4gcmVkLCBiZW5lZmljaWFyaWVzIGluIGJsdWUsIHNpemUgc2hvd3MgbnVtYmVyIG9mIHBlcnNvbnM7IGNsaWNrIGFuZCBkcmFnIHRvIHpvb207IG1vdXNlIG92ZXIgZm9yIGRldGFpbHMiKSkpIA0KDQojIFdpbGwgdGhpcyB3b3JrPyANCiMgJT4lIHBhcnRpYWxfYnVuZGxlKCkNCg0KIyBnZ3NhdmUoInNpdGVfbWFwLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gOC4yNywgd2lkdGggPSAxMS42OSwgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCg0KRGF0YSBvbiBjYXNoIHJlc3BvbnNlIGV4dHJhY3RlZCBmcm9tIFtGU0wgZWFydGhxdWFrZSB0cmFja2VyXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xS0dxdC0zWURoMms4cU5Da3NPSkFuZFJQTzU2R3E2cEdzNmVzRVF0SUZJdy9lZGl0I2dpZD0xODkwOTgxMTE1KSBvbiBNYXJjaCAxNyAyMDIzLiBEYXRhIG9uIGNvbGxlY3RpdmUgY2VudHJlcyBleHRyYWN0ZWQgZnJvbSBNYXJjaCAxNSAyMDIzLiANCg0KTG9jYXRpb25zIG9mIGJlbmVmaWNpYXJpZXMgaGF2ZSBiZWVuIGVzdGltYXRlZCAtLSB0aGUgRlNMIGRhdGFzZXQgZG9lcyBub3QgY2FsbCBmb3IgdGhlIGlucHV0IG9mIGdlb2Nvb3JkaW5hdGVzLiBJbnN0ZWFkLCB0aGUgYmx1ZSBjaXJjbGVzIGFyZSBzaXR1YXRlZCBhdCB0aGUgY2VudHJvaWRzIGZvciBjb21tdW5pdGllcy92aWxsYWdlcywgYXMgcmVjb3JkZWQgaW4gdGhlIE9DSEEgZ2VvZGFtaW5zIHJlZmVyZW5jZSBkYXRhc2V0LiANCg0KVGhpcyBtZWFucyB0aGF0IHdlIGRvIG5vdCBoYXZlIGFuIGFjY3VyYXRlIHJlY29yZCBvZiB3aGljaCBjZW50cmVzIGhhdmUgcmVjZWl2ZWQgd2hpY2ggYWN0aXZpdGllcy4gVGhpcyB1bmRlcnNjb3JlcyB0aGUgaW1wb3J0YW5jZSBvZiBpbmNsdWRpbmcgb2YgY29kaWZ5aW5nIGFuZCBpbmNsdWRpbmcgZWFjaCBvZiB0aGUgdGVtcG9yYXJ5IHNpdGVzIHNvIHRoYXQgd2UgbWF5IHRyYWNrIHRoZSBwcm9ncmVzcyBvZiB0aGUgcmVzcG9uc2UgYW5kIGlkZW50aWZ5IGFueSBnYXBzIGluIGNvdmVyYWdlIHRoYXQgYXJpc2UuIFRlbXBvcmFyeSBzaXRlcyBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhlIHJldmlzZWQgNFdzLiANCg0KPGJyPjxicj4NCg0KDQojIDMuIEdlb2dyYXBoaWMgYnJlYWtkb3duIG9mIGJlbmVmaWNpYXJpZXMNCg0KQ292ZXJhZ2UgaXMgaGlnaGVzdCBpbiBBZnJpbiBhbmQgSGFyaW0gZGlzdHJpY3RzIC0tIHN1YnN0YW50aWFsbHkgc28uIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNsICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5ID09ICJDYXNoIFJlc3BvbnNlIiAmIHBsYW5uZWRfaW1wbGVtZW50ZWQgPT0gIkltcGxlbWVudGVkIikgJT4lIA0KICBtdXRhdGUoZ292ZXJub3JhdGUgPSBpZmVsc2UoZ292ZXJub3JhdGUgPT0gImlkbGViIiwgIklkbGViIiwgZ292ZXJub3JhdGUpLA0KICAgICAgICAgZGlzdHJpY3QgPSBpZmVsc2UoZGlzdHJpY3QgPT0gImlkbGViIiwgIklkbGViIiwgZGlzdHJpY3QpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShkaXN0cmljdCA9IGZjdF9yZW9yZGVyKGRpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICBnb3Zlcm5vcmF0ZSA9IGZjdF9yZWxldmVsKGdvdmVybm9yYXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiSWRsaWIiLCAiQWxlcHBvIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBkaXN0cmljdCkpICsgDQogIGdlb21fY29sKGFlcyhmaWxsID0gZ292ZXJub3JhdGUpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogIGxhYnModGl0bGUgPSAiTVBDIGJlbmVmaWNpYXJpZXMgYnkgZGlzdHJpY3QiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJhcyBvZiAxNyBNYXJjaCAyMDIzIiwgDQogICAgICAgeSA9ICIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KDQpobm8gJT4lIA0KICBmaWx0ZXIoYWRtaW4ybmFtZV9lbiAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikpICU+JSANCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCBkaXN0cmljdCA9IGFkbWluMm5hbWVfZW4pICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3BvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBsZWZ0X2pvaW4oDQogICAgZnNsICU+JQ0KICAgICAgZmlsdGVyKGFjdGl2aXR5ID09ICJDYXNoIFJlc3BvbnNlIiAmIHBsYW5uZWRfaW1wbGVtZW50ZWQgPT0gIkltcGxlbWVudGVkIikgJT4lIA0KICAgICAgbXV0YXRlKGdvdmVybm9yYXRlID0gaWZlbHNlKGdvdmVybm9yYXRlID09ICJpZGxlYiIsICJJZGxlYiIsIGdvdmVybm9yYXRlKSwNCiAgICAgICAgICAgICBkaXN0cmljdCA9IGlmZWxzZShkaXN0cmljdCA9PSAiaWRsZWIiLCAiSWRsZWIiLCBkaXN0cmljdCkpICU+JSANCiAgICAgIGdyb3VwX2J5KGRpc3RyaWN0KSAlPiUgDQogICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAsICANCiAgYnkgPSAiZGlzdHJpY3QiKSAlPiUgDQogIG11dGF0ZShkaXN0cmljdCA9IGZjdF9yZW9yZGVyKGRpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICBnb3Zlcm5vcmF0ZSA9IGZjdF9yZWxldmVsKGdvdmVybm9yYXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiSWRsaWIiLCAiQWxlcHBvIikpLCANCiAgICAgICAgIHBjX3JlYWNoZWQgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGNfcmVhY2hlZCwgeSA9IGRpc3RyaWN0KSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IGdvdmVybm9yYXRlKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHBjX3JlYWNoZWQpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogIGxhYnModGl0bGUgPSAiUGVyY2VudCBvZiBwb3B1bGF0aW9uIHJlYWNoZWQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJhcyBvZiAxNyBNYXJjaCAyMDIzIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB4ID0gIiUgb2YgcG9wdWxhdGlvbiByZWFjaGVkIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCg0KYGBgDQoNCjxicj4NCg0KVGhlIGN1cnJlbnQgZGlzdHJpYnV0aW9uIG9mIGJlbmVmaWNpYXJpZXMsIGF0IGxlYXN0IGF0IGRpc3RyaWN0IGxldmVsLCBpcyBjb21tb25zZW5zaWNhbC4gSGFyaW0gYW5kIEFmcmluIGRvIGhhdmUgYSBtdWNoIGxhcmdlciBzaGFyZSBvZiB0aGUgZWFydGhxYXVrZSBpbXBhY3RzLiBCZWFyIGluIG1pbmQgdGhhdCB0aGUgZmlndXJlcyBiZWxvdyBvbmx5IHBlcnRhaW4gdG8gcG9wdWxhdGlvbnMgd2l0aGluIHRoZSBBT0Mgb2YgTm9ydGh3ZXN0IFN5cmlhIGFuZCBub3QgYWxsIHBhcnRzIG9mIGVhY2ggZGlzdHJpY3QgYXJlIGluY2x1ZGVkLiANCg0KPGJyPg0KDQoNCmBgYHtyfQ0KZXEgJT4lIA0KICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJiANCiAgICAgICAgICAgZGlzdHJpY3QgJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCkgJT4lIA0KICBzdW1tYXJpc2UoY2FzdWFsdGllcyA9IHN1bShjYXN1YWx0aWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGluanVyaWVzID0gc3VtKGluanVyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHRvdGFsbHlfZGFtYWdlZCA9IHN1bShjb21wbGV0ZWx5X2Rlc3Ryb3llZF9ob3VzZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgcGFydGlhbGx5X2RhbWFnZWQgPSBzdW0oZGFtYWdlZF91bmloYWJpdGFibGVfaG91c2VzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgIyBXaGVyZSBpcyBBcmloYSwgYW5kIHdoeSBpcyBpdCBzaG93aW5nIHVwIGhlcmUNCiAgZmlsdGVyKGRpc3RyaWN0ICE9ICJBcmloYSIpICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmDQogICAgICAgICAgICAgICAgICAgICAgIGFkbWluMm5hbWVfZW4gJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gImRpc3RyaWN0IikgJT4lIA0KICBtdXRhdGUod291bmRlZF9kZWFkID0gY2FzdWFsdGllcyArIGluanVyaWVzLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzID0gdG90YWxseV9kYW1hZ2VkICsgcGFydGlhbGx5X2RhbWFnZWQsIA0KICAgICAgICAgd291bmRlZF9kZWFkXzEwMGsgPSByb3VuZCh3b3VuZGVkX2RlYWQgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlc18xMDBrID0gcm91bmQoZGFtYWdlZF9ob3VzZXMgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCB3b3VuZGVkX2RlYWQsIHdvdW5kZWRfZGVhZF8xMDBrLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzLCBkYW1hZ2VkX2hvdXNlc18xMDBrKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgc2V0X2NhcHRpb24oIkNhc3VhbHRpZXMgYW5kIGRhbWFnZWQgaG91c2VzLCBhYnNvbHV0ZSBmaWd1cmVzIGFuZCBwZXIgMTAwLDAwMCBwZXJzb25zIikgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDM6NiwgcGFydCA9ICJoZWFkZXIiLA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIkRhdGEgZnJvbSB0aGUgQXNzaXN0YW5jZSBDb29yZGluYXRpb24gVW5pdCwgU3lyaWEgMjAyMzAzMDciKSkNCg0KDQpgYGANCg0KV2hlbiByZXZpZXdpbmcgdGhlIGRpc3RyaWN0LWxldmVsIHNwcmVhZCBvZiBjYXN1YWx0aWVzIGFuZCB0b3RhbGx5LSBhbmQgcGFydGlhbGx5LWRhbWFnZWQgaG91c2VzLCBIYXJpbSBhbmQgQWZyaW4gZG8gc3RhbmQgb3V0IGluIHRlcm1zIG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRhbWFnZSwgdGhvdWdoIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBzaGFyZSBvZiBkYW1hZ2VkIGhvdXNlcyBpbiBBZnJpbiBpcyBtdWNoIGhpZ2hlciB0aGFuIGluIEhhcmltLiANCg0KRm9sbG93aW5nIHRoZW0sIEplYmVsIFNhbWFuIGFuZCBKaXNyLWFzaC1TaHVndXIgaGF2ZSB0aGUgbmV4dCBtb3N0IHNldmVyZSBkYW1hZ2UsIHRob3VnaCwgYXMgY2FuIGJlIHNlZW4gZnJvbSB0aGUgdGFibGUgYmVsb3csIHRoZWlyIHBvcHVsYXRpb25zICh3aXRoaW4gdGhlIGFyZWEgb2YgY29udHJvbCkgYXJlIGNvbXBhcmF0aXZlbHkgc21hbGxlci4gDQoNCkFzc2Vzc21lbnRzIGFyZSBzdGlsbCBvbmdvaW5nIGFuZCB0aGUgQ1dHIHdpbGwgdXBkYXRlIHRoZXNlIHRhYmxlcyB3aGVuIG5ldyBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLiANCg0KPGJyPg0KDQoNCmBgYHtyfQ0KDQpobm8gJT4lIA0KICBmaWx0ZXIoYWRtaW4ybmFtZV9lbiAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikgJg0KICAgICAgICAgICBhb19jID09ICJOVyIpICU+JSANCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCBkaXN0cmljdCA9IGFkbWluMm5hbWVfZW4pICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3BvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBsZWZ0X2pvaW4oDQogICAgZnNsICU+JQ0KICAgICAgZmlsdGVyKGFjdGl2aXR5ID09ICJDYXNoIFJlc3BvbnNlIiAmIHBsYW5uZWRfaW1wbGVtZW50ZWQgPT0gIkltcGxlbWVudGVkIikgJT4lIA0KICAgICAgbXV0YXRlKGdvdmVybm9yYXRlID0gaWZlbHNlKGdvdmVybm9yYXRlID09ICJpZGxlYiIsICJJZGxlYiIsIGdvdmVybm9yYXRlKSwNCiAgICAgICAgICAgICBkaXN0cmljdCA9IGlmZWxzZShkaXN0cmljdCA9PSAiaWRsZWIiLCAiSWRsZWIiLCBkaXN0cmljdCkpICU+JSANCiAgICAgIGdyb3VwX2J5KGRpc3RyaWN0KSAlPiUgDQogICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QocGFydG5lcl9jb2RlKSkgLCAgDQogIGJ5ID0gImRpc3RyaWN0IikgJT4lIA0KICBtdXRhdGUoYCVfcmVhY2hlZGAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVsb2NhdGUocGFydG5lcnMsIC5hZnRlciA9IGxhc3RfY29sKCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC44KSAlPiUgDQogIHNldF9jYXB0aW9uKCJQZXJjZW50YWdlIG9mIHBvcHVsYXRpb24gcmVhY2hlZCBieSBkaXN0cmljdCIpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSAzLCBwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIk9ubHkgcGVyc29ucyB3aXRoaW4gdGhlIE5XIEFyZWEgb2YgQ29udHJvbCIpKQ0KYGBgDQoNCjxicj4NCg0KVGhvdWdoIHRoZSBlYXJ0aHF1YWtlIGRhbWFnZSBpcyBub3QgYXMgc2V2ZXJlIGluIEEnemF6LCBBbCBCYWIsIEphcmFibHVzLCBJZGxlYiBhbmQgSmlzci1hc2gtU2h1Z3VyLCBhIG11Y2ggaGlnaGVyIHByb3BvcnRpb24gb2YgbmVlZHMgaW4gdGhlc2UgYXJlYXMgcmVtYWluIHVubWV0LCBnaXZlbiB0aGUgbG93IHBlcmNlbnRhZ2VzIG9mIHBlcnNvbnMgcmVhY2hlZC4gDQoNClRoZSBlc3RhYmxpc2htZW50IG9mIHN1Ym5hdGlvbmFsIHRhcmdldHMgYXQgdGhlIGRpc3RyaWN0IGFuZCBzdWItZGlzdHJpY3QgbGV2ZWwsIHdpbGwgZ28gc29tZSB3YXkgdG93YXJkcyBjbGFyaWZ5aW5nIGhvdyByZXNvdXJjZXMgc2hvdWxkIGJlIGFsbG9jYXRlZCBhY3Jvc3MgdGhlIGFmZmVjdGVkIGFyZWFzLiANCg0KDQo8YnI+PGJyPg0KDQojIyAzLjEgQnJlYWtkb3duIGJ5IHBhcnRuZXIgYW5kIGRpc3RyaWN0DQoNCkhhcmltLCBieSBmYXIgYW5kIGF3YXkgaGFzIHRoZSBoaWdoZXN0IGNvbmNlbnRyYXRpb24gb2YgcGFydG5lcnMgKDEyKSwgZG91YmxlIHRoYXQgb2YgdGhlIG5leHQgaGlnaGVzdCBkaXN0cmljdCAoQWZyaW4pLiANCg0KPGJyPg0KDQpgYGB7cn0NCg0KDQpzdGFja190ZXh0IDwtIGZzbCAlPiUgDQogIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSANCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUsIGRpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShkaXN0cmljdCA9IGZjdF9yZWxldmVsKGRpc3RyaWN0LCBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLCANCiAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSkNCg0Kc3RhY2sgPC0gZnNsICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5ID09ICJDYXNoIFJlc3BvbnNlIiAmIHBsYW5uZWRfaW1wbGVtZW50ZWQgPT0gIkltcGxlbWVudGVkIikgJT4lIA0KICBncm91cF9ieShkaXN0cmljdCwgcGFydG5lcl9jb2RlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoZGlzdHJpY3QgPSBmY3RfcmVsZXZlbChkaXN0cmljdCwgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSwgDQogICAgICAgICBkaXN0cmljdCA9IGZjdF9yZXYoZGlzdHJpY3QpKSAlPiUNCiAgZ2dwbG90KGFlcyh5ID0gZGlzdHJpY3QsIA0KICAgICAgICAgICAgIHggPSBiZW5lZmljaWFyaWVzKSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IHBhcnRuZXJfY29kZSkpICsgDQogIGdlb21fdGV4dChkYXRhID0gc3RhY2tfdGV4dCwgDQogICAgICAgICAgICBhZXMoeCA9IHRvdGFsICsgNjAwMCwgDQogICAgICAgICAgICAgICAgbGFiZWwgPSBzY2FsZXM6OmNvbW1hKHRvdGFsKSkpICsgDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgbGFicyh5ID0gIiIsIA0KICAgICAgIHggPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIlBhcnRuZXIgYWNoaWV2ZW1lbnRzIGJ5IGRpc3RyaWN0LCAyMDIzMDMxNyIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KZ2dwbG90bHkoc3RhY2ssIHRvb2x0aXAgPSBjKCJmaWxsIiwgIngiLCAieSIpKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiUGFydG5lciBhY2hpZXZlbWVudHMgYnkgZGlzdHJpY3QsIDIwMjMwMzE3IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW91c2Ugb3ZlciBmb3IgZGV0YWlscyIpKSkNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIDMuMiBTY2F0dGVycGxvdCBvZiBzdWItZGlzdHJpY3RzIA0KDQpUaGUgcGxvdCBiZWxvdyBzaG93cyB0aGUgdG90YWwgcG9wdWxhdGlvbiBvZiBlYWNoIHN1Yi1kaXN0cmljdCBvbiB0aGUgeC1heGlzIChmb3IgdGhlIG1vbWVudCwgYWxsIHBlcnNvbnMgaW4gdGhlc2UgYXJlYXMgYXJlIGFzc3VtZWQgdG8gYmUgYWZmZWN0ZWQgYW5kIGFyZSBpbmNsdWRlZCBpbiB0aGUgUElOKSBhbmQgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIG9uIHRoZSB5LWF4aXMuIA0KDQpUaGUgc2l6ZSBvZiBlYWNoIHBvaW50IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGRlYWQgb3Igd291bmRlZCBwZXJzb25zIHRoZXJlIHBlciAxMDAsMDAwLiANCg0KPGJyPg0KDQoNCmBgYHtyLCBkcGkgPSAzMDB9DQplcSAlPiUgDQogIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmIA0KICAgICAgICAgICBkaXN0cmljdCAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikpICU+JSANCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBzdWJfZGlzdHJpY3QsIGFkbWluM3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShjYXN1YWx0aWVzID0gc3VtKGNhc3VhbHRpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgaW5qdXJpZXMgPSBzdW0oaW5qdXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdG90YWxseV9kYW1hZ2VkID0gc3VtKGNvbXBsZXRlbHlfZGVzdHJveWVkX2hvdXNlcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBwYXJ0aWFsbHlfZGFtYWdlZCA9IHN1bShkYW1hZ2VkX3VuaWhhYml0YWJsZV9ob3VzZXMsIG5hLnJtID0gVFJVRSkpICU+JQ0KICAjIFdoZXJlIGlzIEFyaWhhLCBhbmQgd2h5IGlzIGl0IHNob3dpbmcgdXAgaGVyZQ0KICBmaWx0ZXIoZGlzdHJpY3QgIT0gIkFyaWhhIikgJT4lIA0KICBsZWZ0X2pvaW4oaG5vICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGFkbWluM3Bjb2RlICVpbiUgbndfcGNvZGUzICYNCiAgICAgICAgICAgICAgICAgICAgICAgYWRtaW4ybmFtZV9lbiAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNwY29kZSkgJT4lDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwb3B1bGF0aW9uID0gc3VtKHRvdGFsX3BvcHVsYXRpb24sIG5hLnJtID0gVFJVRSkpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBtdXRhdGUod291bmRlZF9kZWFkID0gY2FzdWFsdGllcyArIGluanVyaWVzLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzID0gdG90YWxseV9kYW1hZ2VkICsgcGFydGlhbGx5X2RhbWFnZWQsIA0KICAgICAgICAgd291bmRlZF9kZWFkXzEwMGsgPSByb3VuZCh3b3VuZGVkX2RlYWQgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlc18xMDBrID0gcm91bmQoZGFtYWdlZF9ob3VzZXMgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICAgIGxlZnRfam9pbihmc2wgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpLCANCiAgICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBvcHVsYXRpb24sIHkgPSBiZW5lZmljaWFyaWVzKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHdvdW5kZWRfZGVhZF8xMDBrKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHN1Yl9kaXN0cmljdCksIGhqdXN0ID0gMSwgdmp1c3QgPSAxLCANCiAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IGMoMCwgMzAwMCwgMTAwMDAsIDMwMDAwLCAxMDAwMDAsIDMwMDAwMCwgMTAwMDAwMCksIA0KICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV95X2xvZzEwKGJyZWFrcyA9IGMoMCwgMTAwMCwgMzAwMCwgMTAwMDAsIDMwMDAwLCAxMDAwMDApLA0KICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV9zaXplKGJyZWFrcyA9IGMoMCwgMTAwLCA1MDAsIDEwMDAsIDMwMDApKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICJibHVlIikgKw0KICBsYWJzKHRpdGxlID0gIlBvcHVsYXRpb24gYW5kIE1QQyBiZW5lZmljaWFyaWVzIGJ5IHN1Yi1kaXN0cmljdCIsDQogICAgICAgc3VidGl0bGUgPSAiU2l6ZSBpbmRpY2F0ZXMgZGVhZC93b3VuZGVkIHBlciAxMDAsMDAwMCIsIA0KICAgICAgIHggPSAiUG9wdWxhdGlvbiIsIA0KICAgICAgIHkgPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHNpemUgPSAiRGVhZC93b3VuZGVkXG5wZXIgMTAwayIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBmcm9tIEFzc2lzdGFuY2UgQ29vcmRpbmF0aW9uIFVuaXQgYW5kIEZvb2QgU2VjdXJpdHkgYW5kIExpdmVsaWhvb2RzIENsdXN0ZXIiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkNCmBgYA0KDQo8YnI+DQoNCk92ZXJhbGwsIHdlIHNlZSBmYWlyIGFsaWdubWVudCBiZXR3ZWVuIHRoZSBtYWduaXR1ZGUgb2YgdGhlIG5lZWRzICh0b3RhbCBwb3B1bGF0aW9uKSBhbmQgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIC0tIHRoaXMgaXMgZXZpZGVuY2VkIGJ5IHRoZSBibHVlIGxpbmUgc2hvd2luZyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcC4gDQoNCkhvd2V2ZXIsIHdlIGRvIG5vdGUgc2V2ZXJhbCBtaXNtYXRjaGVzIC0tIERhbmEgc2VlbXMgdG8gaGF2ZSByZWNlaXZlZCBhbiBvdXRzaXplZCBzaGFyZSBvZiBiZW5lZmljaWFyaWVzLCBlc3BlY2lhbGx5IHdoZW4gY29uc2lkZXJpbmcgdGhlIGNhc3VhbHR5IHJhdGUuIEFuZCBLYWZyIFRha2hhcmltIHNlZW1zIHRvIGhhdmUgYmVlbiBhbGxvY2F0ZWQgcmVsYXRpdmVseSBmZXdlciByZXNvdXJjZXMgaW4gY29tcGFyaXNvbiB0byB0aGUgZGVhdGggdG9sbCB0aGVyZS4gDQoNCg0KPGJyPjxicj48YnI+DQoNCg0KIyA0LiBDYXNoIHJlc3BvbnNlIGFjdG9ycyBhbmQgY2FzaCBkaXNidXJzZWQNCg0KSW4gdGhlIHNjYXR0ZXJwbG90IGJlbG93LCBlYWNoIHBvaW50IGlzIGEgc2luZ2xlIGNhc2ggd29ya2luZyBncm91cCBwYXJ0bmVyLiBUaGUgeC1heGlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBwZXIgYWdlbmN5IGFuZCB0aGUgeS1heGlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNvbW11bml0aWVzIChhZG1pbjQpIHJlYWNoZWQuIA0KDQo8YnI+DQoNCmBgYHtyIHRvdGFscywgZXZhbCA9IEZBTFNFfQ0KDQpmc2wgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHkgPT0gIkNhc2ggUmVzcG9uc2UiICYgcGxhbm5lZF9pbXBsZW1lbnRlZCA9PSAiSW1wbGVtZW50ZWQiKSAlPiUgDQogIG11dGF0ZSh1c2RfdG90YWwgPSBmYW1pbGllcyAqIHF1YW50aXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdXNkX3RvdGFsID0gc3VtKHVzZF90b3RhbCwgbmEucm0gPSBUUlVFKSkNCg0KYGBgDQoNCg0KDQpgYGB7ciBwYXJ0bmVyLXNjYXR0ZXJ9DQpwYXJ0bmVyX3NjYXR0ZXIgPC0gZnNsICU+JSANCiAgIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSANCiAgZ3JvdXBfYnkocGFydG5lcl9jb2RlLCANCiAgICAgICAgICAgYWRtaW4ycGNvZGUsIA0KICAgICAgICAgICBhZG1pbjRwY29kZSkgJT4lIA0KICBzbGljZSh3aGljaC5tYXgoYmVuZWZpY2lhcmllcykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZ3JvdXBfYnkocGFydG5lcl9jb2RlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgY29tbXVuaXRpZXMgPSBuX2Rpc3RpbmN0KGFkbWluNHBjb2RlKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gY29tbXVuaXRpZXMpKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChwYXJ0bmVyX2NvZGUsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBmb3JtYXQoYmVuZWZpY2lhcmllcywgYmlnLm1hcmsgPSAiLCIpLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXRpZXM6ICIsIGNvbW11bml0aWVzKSkpICsgDQogIHNjYWxlX3hfbG9nMTAobGFiZWxzID0gY29tbWEpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyANCiAgbGFicyh4ID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiQ29tbXVuaXRpZXMgKGFkbWluNCkgcmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIkltcGxlbWVudGluZyBwYXJ0bmVycyAtLSBiZW5lZmljaWFyaWVzIGFuZCBjb21tdW5pdGllcyByZWFjaGVkIikNCg0KZ2dwbG90bHkocGFydG5lcl9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUgDQogIGxheW91dChzaG93bGVnZW5kID0gVFJVRSwgbGVnZW5kID0gbGlzdChmb250ID0gKGxpc3Qoc2l6ZSA9IDYpKSkpICU+JSANCiAgcGxvdGx5OjpzdHlsZShob3Zlcm9uID0gInBvaW50IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkJlbmVmaWNpYXJpZXMgYW5kIGNvbW11bml0aWVzIHJlYWNoZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXNoIHJlc3BvbnNlIGltcGxlbWVudGluZyBwYXJ0bmVycyIsIjwvc3VwPiIpKSkNCg0KDQpgYGANCg0KPGJyPg0KDQpVU0QgYHIgZnNsICU+JSBmaWx0ZXIoYWN0aXZpdHkgPT0gIkNhc2ggUmVzcG9uc2UiICYgcGxhbm5lZF9pbXBsZW1lbnRlZCA9PSAiSW1wbGVtZW50ZWQiKSAlPiUgbXV0YXRlKHVzZF90b3RhbCA9IGZhbWlsaWVzICogcXVhbnRpdHkpICU+JSB7c3VtKC4kdXNkX3RvdGFsKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIGFjcm9zcyBgciBmc2wgJT4lIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSB7bl9kaXN0aW5jdCguJGFkbWluNHBjb2RlKX1gIGNvbW11bml0aWVzIGFuZCBgciBmc2wgJT4lIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSB7bl9kaXN0aW5jdCguJGFkbWluM3Bjb2RlKX1gIHN1Yi1kaXN0cmljdHMgaW4gTlcgU3lyaWEuDQoNCg0KVGhlIHRhYmxlIGJlbG93IHN1bW1hcmlzZXMgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzY2F0dGVycGxvdCBhYm92ZSBpbiB0YWJ1bGFyIGZvcm06DQoNCjxicj4NCg0KDQoNCmBgYHtyfQ0KZnNsICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5ID09ICJDYXNoIFJlc3BvbnNlIiAmIHBsYW5uZWRfaW1wbGVtZW50ZWQgPT0gIkltcGxlbWVudGVkIikgJT4lIA0KICBncm91cF9ieShwYXJ0bmVyX2NvZGUsIA0KICAgICAgICAgICBhZG1pbjJwY29kZSwgDQogICAgICAgICAgIGFkbWluNHBjb2RlKSAlPiUgDQogIHNsaWNlKHdoaWNoLm1heChiZW5lZmljaWFyaWVzKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBncm91cF9ieShwYXJ0bmVyX2NvZGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBkaXN0cmljdHMgPSBuX2Rpc3RpbmN0KGFkbWluMnBjb2RlKSwgDQogICAgICAgICAgICBjb21tdW5pdGllcyA9IG5fZGlzdGluY3QoYWRtaW40cGNvZGUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJSZWFjaCBhbmQgZm9vdHByaW50IG9mIGNhc2ggcmVzcG9uc2UgYWN0b3JzIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC44KSAlPiUgDQogIGZvb3Rub3RlKGFzX3BhcmFncmFwaCgiT25seSBwYXJ0bmVycyB3aG8gcHJvdmlkZWQgbW9yZSB0aGFuIFVTRCAxMDAvZmFtaWx5L21vbnRoIiksIA0KICAgICAgICAgICBpID0gMSwgaiA9IDEsIHBhcnQgPSAiaGVhZGVyIikNCiAgDQpgYGANCg0KDQoNCjxicj48YnI+DQoNCg0KDQojIyA0LjEgVVNEIGRpc2J1cnNlZCBieSBwYXJ0bmVyDQoNClRoZXJlIGlzIHZlcnkgZ29vZCBjb21wbGlhbmNlIHdpdGggQ1dHIHN0YW5kYXJkcyBvbiB0aGUgdHJhbnNmZXIgdmFsdWVzIG9mIG11bHRpcHVycG9zZSBjYXNoIGludGVydmVudGlvbnMsIGFzIGNhbiBiZSBzZWVuIGJ5IHRoZSBgdXNkX3Blcl9mYW1gIGNvbHVtbiBpbiB0aGUgdGFibGUgYmVsb3cuIA0KDQo8YnI+DQoNCg0KYGBge3J9DQpmc2wgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHkgPT0gIkNhc2ggUmVzcG9uc2UiICYgcGxhbm5lZF9pbXBsZW1lbnRlZCA9PSAiSW1wbGVtZW50ZWQiKSAlPiUgDQogIG11dGF0ZSh1c2RfdG90YWwgPSBmYW1pbGllcyAqIHF1YW50aXR5KSAlPiUgDQogIGdyb3VwX2J5KHBhcnRuZXJfY29kZSkgJT4lIA0KICBzdW1tYXJpc2UodXNkX3RvdGFsID0gc3VtKHVzZF90b3RhbCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBmYW1pbGllcyA9IHN1bShmYW1pbGllcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodXNkX3Blcl9mYW0gPSByb3VuZCh1c2RfdG90YWwgLyBmYW1pbGllcywgZGlnaXRzID0gMiksIA0KICAgICAgICAgYCVfdXNkX3RvdGFsYCA9IHJvdW5kKHVzZF90b3RhbCAvIHN1bSh1c2RfdG90YWwpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikpICU+JQ0KICBhcnJhbmdlKGRlc2ModXNkX3RvdGFsKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJVU0QgZGlzYnVyc2VkIGFuZCBmYW1pbGllcyByZWFjaGVkIGJ5IHBhcnRuZXIiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBmbGV4dGFibGU6OnNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOCkNCmBgYA0KDQoNCjxicj4NCg0KQnJvYWRlbmluZyB0aGUgc2NvcGUgdG8gbG9vayBhdCBhbGwgY2FzaC1iYXNlZCBhY3Rpdml0aWVzLCBub3QganVzdCBNUEMsIGl0IGlzIHN0aWxsIG9ic2VydmVkIHRoYXQgbW9yZSB0aGF0IDMvNCBvZiBhbGwgYmVuZWZpY2lhcnkgaG91c2Vob2xkcyBoYXZlIHJlY2VpdmVkIGEgVVNEIDE1MCBwYXltZW50LCB3aXRoIGFib3V0IDEwJSByZWNlaXZpbmcgVVNEIDUwLiANCg0KVGhpcyBtYXkgbmVjZXNzaXRhdGUgc3BsaXR0aW5nIHRoZSBgQ2FzaCBSZXNwb25zZWAgYWN0aXZpdHkgaW50byBhIGZ1bGwtcmF0aW9uIGFuZCBoYWxmL3F1YXJ0ZXIgcmF0aW9uIGFjdGl2aXRpZXMuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNsICU+JSANCiAgZmlsdGVyKHVuaXQgPT0gIlVTRCIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSANCiAgZ3JvdXBfYnkodXNkX3RyYW5zZmVyX3ZhbHVlID0gcXVhbnRpdHkpICU+JSANCiAgc3VtbWFyaXNlKGZhbWlsaWVzID0gc3VtKGZhbWlsaWVzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHVzZF90cmFuc2Zlcl92YWx1ZSA9IHBhc3RlMCgiJCIsIHVzZF90cmFuc2Zlcl92YWx1ZSkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlVTRCB0cmFuc2ZlciB2YWx1ZXMgZm9yIGFsbCBjYXNoLWJhc2VkIGFjdGl2aXRpZXMsIG5vdCBqdXN0IE1QQyIpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSAzLCBwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIkRhdGEgZnJvbSB0aGUgRlNMIHRyYWNrZXIsIGFsbCBjYXNoIGFuZCBGU0wgYWN0dml0aWVzIGluY2x1ZGVkIikpICU+JSANCiAgZmxleHRhYmxlOjpzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjgpDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KDQojIDUuIFVOSENSIHNpdGUgdHJhY2tlciAtLSBzZWFyY2hhYmxlIHRhYmxlDQoNCkRhdGEgZnJvbSBbVU5IQ1Igc2l0ZSB0cmFja2VyXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xRERCdklUZGc1bjRlQy1sM202V0VhTEU3MjkwZXo5aE0vZWRpdCNnaWQ9NTU0ODAxOTk5KS4gRXh0cmFjdGVkIDIwMjMwMzE1LiANCg0KYGBge3IgZHR9DQpzaXRlcyAlPiUgDQogIHNlbGVjdChnb3Zlcm5vcmF0ZSwgDQogICAgICAgICBkaXN0cmljdCwgDQogICAgICAgICBzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgY29tbXVuaXR5LCANCiAgICAgICAgIHNpdGVfbmFtZSwgDQogICAgICAgICBsb25naXR1ZGVfeCwNCiAgICAgICAgIGxhdGl0dWRlX3ksIA0KICAgICAgICAgZmFtaWxpZXMsIA0KICAgICAgICAgaW5kaXZpZHVhbHMsIA0KICAgICAgICAgZm9jYWxfcG9pbnQgPSBvcmdhbml6YXRpb25fbmFtZSwgDQogICAgICAgICBmb2NhbF9jb250YWN0ID0gcGhvbmUpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgdGFibGUgLS0gQ29sbGVjdGl2ZSBzaXRlcywgbWFpbnRhaW5lZCBieSBVTkhDUiIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpDQogIA0KYGBgDQoNCg0KDQoNCg0K